import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.Pattern;

public class compiler {
    static boolean remove_flag = false;
    static ArrayList<String> tokens = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        File input_file = new File(args[0]);
        File output_file = new File(args[1]);
        Scanner input = new Scanner(input_file);
        lexAnalyse lex = new lexAnalyse();//词法分析器
        while (input.hasNextLine()) {
            String in = input.nextLine();
            System.out.println(in);
            in = remove_annotation(in);//去除注释
            if (in.equals("")) {
                continue;
            }
            tokens.addAll(lex.analyse(in));//获取tokens
        }
        if (remove_flag) {//意味着/* 没找到匹配的 */报错退出
            err("remove_annotation:未找到匹配的'*/'");
        }
        input.close();//关闭源代码读取
        System.out.println(tokens.toString());
        synAnalyse syn = new synAnalyse(tokens);//语法分析器
        AST tree = syn.build_AST();//生成语法树
        //语义分析
        //生成中间代码
        FileWriter out_write = new FileWriter(output_file);
        irGenerator generator = new irGenerator(out_write);//中间代码生成器
        generator.generate(tree);//遍历语法树,生成中间代码
        out_write.close();//关闭输出中间代码文件
    }

    //去除注释 //  和  /* ... */
    static String remove_annotation(String str) {
        if (Pattern.compile("//").matcher(str).find()) {
            return remove_annotation(str.substring(0, str.indexOf("//")));
        } else if (!remove_flag && Pattern.compile("/\\*").matcher(str).find()) {
            if (Pattern.compile("\\*/").matcher(str).find()) {
                return str.substring(0, str.indexOf("/*")) + str.substring(str.indexOf("*/") + 2);
            } else {
                remove_flag = true;
                return str.substring(0, str.indexOf("/*"));
            }
        } else if (remove_flag) {
            if (!Pattern.compile("\\*/").matcher(str).find()) {
                return "";
            } else {
                remove_flag = false;
                return remove_annotation(str.substring(str.indexOf("*/") + 2));
            }
        } else {
            return str;
        }
    }

    static void err(String message) {
        System.out.println(message);
        System.exit(1);
    }
}
